module AboutYou
  module SDK
    module CacheProvider
      ###
      # This class is used as an interface for cache operations.
      # It is used when caching with Redis.
      #
      # author:: Collins GmbH & Co KG
      ###
      class Redis
        require 'redis'

        # an instance of the cache client.
        attr_accessor :client

        ###
        # the Constructor for the Redis class
        #
        # * *Args*    :
        #   - +client+ -> an instance of Redis
        #
        # * *Returns* :
        #   - Instance of AboutYou::SDK::CacheProvider::Redis
        ###
        def initialize(client)
          self.client = client
        end

        ###
        # This method is used for setting new cache entries with Redis.
        #
        # * *Args*    :
        #   - +key+ -> The key of the cache entry
        #   - +value+ -> The value of the cache entry
        #   - +duration+ -> the duration of the cache entry
        #
        # * *Returns* :
        #   - True/False determining whether the setting was successful of not
        ###
        def set(key, value, duration)
          value = value.to_json unless value.is_a?(String)
          client.set(key, value)
          client.expire(key, duration)
        end

        ###
        # This method is used for getting cache entries with Redis.
        #
        # * *Args*    :
        #   - +key+ -> The key of the cache entry
        #
        # * *Returns* :
        #   - Either the value for the given key or nil if the key was not found
        ###
        def get(key)
          JSON.parse(client.get(key))
        end

        ###
        # This method is used for deleting cache entries with Redis.
        #
        # * *Args*    :
        #   - +key+ -> The key of the cache entry
        #
        # * *Returns* :
        #   - True/False determining whether the deletion was successful or not
        ###
        def delete(key)
          client.del(key)
        end

        ###
        # This method is used for checking whether a cache entry exists or not with Redis.
        #
        # * *Args*    :
        #   - +key+ -> The key of the cache entry
        #
        # * *Returns* :
        #   - True/False determining whether the key exists in the cache or not
        ###
        def exists(key)
          client.exists(key)
        end
      end
    end
  end
end
